home *** CD-ROM | disk | FTP | other *** search
- /*
- * general polygon idle desk accessory
- *
- * bounce points with random speeds
- * save in queue
- * connect the dots...
- *
- * keyboard commands:
- *
- * 0-9 select # points in polygon (0 or 1 means 10)
- * [ shorten queue
- * ] lengthen queue
- * q quantize point speed
- */
- #include <hd20:lightspeed:mac:quickdraw.h>
-
- #define nQueue 100 /* max polygons in queue */
- #define qInit 20 /* initial queue size */
- #define qIncr 10 /* queue size increment */
- #define nPoints 10 /* max points per poly */
- #define pInit 4 /* initial # points */
-
- int quantize; /* quantize point deltas */
- /*
- * bouncing points - 1st is value, 2nd is delta, each w/16 bit fraction
- */
- long x[nPoints][2],
- y[nPoints][2];
- /*
- * polygon queue
- */
- int qHead, qTail, qSize, nPinQ, pSize;
- Point pQueue[nQueue][nPoints];
- /*
- * compute new delta
- */
- long
- newDelta(range)
- int range;
- {
- register int r;
- register long d;
-
- if ((r = Random()) < 0)
- r = -r;
- d = ((long)range << 16) / (r % range + 1);
- if (quantize && (d = (d + 0x7FFFL) & ~0xFFFFL) == 0)
- d = 0x10000L;
- return d;
- }
- /*
- * compute new point
- */
- newPoint(p, lo, hi)
- long *p;
- int lo, hi;
- {
- register int v;
-
- v = p[0] >> 16;
- if (v < lo) {
- v = lo;
- p[1] = newDelta(hi - lo);
- }
- else if (v > hi) {
- v = hi;
- p[1] = -newDelta(hi - lo);
- }
- p[0] += p[1];
- return v;
- }
- /*
- * connect the dots...
- */
- drawShape(n, p)
- register int n;
- Point *p;
- {
- MoveTo(p[0].h, p[0].v);
- if (n == 2)
- LineTo(p[1].h, p[1].v);
- else while (--n >= 0)
- LineTo(p[n].h, p[n].v);
- }
- /*
- * initialize stuff
- */
- initIdle(rp)
- Rect *rp;
- {
- register int i;
-
- nPinQ = 0;
- qHead = 0;
- qTail = 0;
- qSize = qInit;
- pSize = pInit;
-
- for (i = 0; i < nPoints; ++i) {
- if (i & 1) { /* L->R */
- x[i][1] = newDelta(rp->right - rp->left);
- x[i][0] = ((long)rp->left << 16) + x[i][1];
- }
- else { /* R->L */
- x[i][1] = -newDelta(rp->right - rp->left);
- x[i][0] = ((long)rp->right << 16) + x[i][1];
- }
- if (i & 2) { /* T->B */
- y[i][1] = -newDelta(rp->bottom - rp->top);
- y[i][0] = ((long)rp->bottom << 16) + y[i][1];
- }
- else { /* B->T */
- y[i][1] = newDelta(rp->bottom - rp->top);
- y[i][0] = ((long)rp->top << 16) + y[i][1];
- }
- }
- }
- /*
- * drawing routine
- */
- runIdle(rp)
- Rect *rp;
- {
- register int i;
-
- ObscureCursor();
- /*
- * undraw stuff at head of queue - shorten if necessary
- */
- while (nPinQ >= qSize) {
- drawShape(pSize, pQueue[qHead]);
- if (++qHead >= nQueue)
- qHead = 0;
- --nPinQ;
- }
- /*
- * compute next set of points
- */
- for (i = 0; i < nPoints; ++i) {
- pQueue[qTail][i].h = newPoint(x[i], rp->left, rp->right);
- pQueue[qTail][i].v = newPoint(y[i], rp->top, rp->bottom);
- }
- /*
- * draw newest polygon
- */
- drawShape(pSize, pQueue[qTail]);
- if (++qTail >= nQueue)
- qTail = 0;
- ++nPinQ;
- }
- /*
- * key events come here
- */
- keyIdle(c)
- {
- switch (c) {
- case '[': /* shorten */
- if ((qSize -= qIncr) < qIncr)
- qSize = qIncr;
- break;
- case ']': /* lengthen */
- if ((qSize += qIncr) > nQueue)
- qSize = nQueue;
- break;
- case 'q':
- quantize = !quantize;
- break;
- case '1': case '0':
- c = 10;
- goto newSize;
- case '2': case '3': case '4': case '5':
- case '6': case '7': case '8': case '9':
- c -= '0';
- newSize:
- ObscureCursor();
- while (nPinQ > 0) {
- drawShape(pSize, pQueue[qHead]);
- if (++qHead >= nQueue)
- qHead = 0;
- --nPinQ;
- }
- pSize = c;
- break;
- }
- }
-